#pragma once

/*
 * 中间件类，这里是 TCP 服务器，对外开展提供接口
 * 对内向 raft core 进行写操作
 * 对内向 state_machine 进行读操作
 */

#include <memory>

#include "bq_log/bq_log.h"
#include "raft_middleware/rpc_proto/middleware_rpc.grpc.pb.h"
#include "raft_utils/Command.h"

namespace raft::middleware {
    class RaftMiddleware {
    public:
        explicit RaftMiddleware(std::shared_ptr<utils::Command> command);

        // 处理接收到了指令
        std::string recv_msg(const std::string &msg);

    protected:
        // 根据命令，填充 command_
        virtual void processing_command(const std::string &str) = 0;

        // 发起 rpc 调用
        std::string send_command();

        std::shared_ptr<utils::Command> command_;

        // 远程 rpc 地址
        // 写命令 地址
        std::string write_address_;
        // 读命令地址
        std::string search_address_;

        // 写命令 rpc
        std::unique_ptr<middleware_rpc_proto::MiddlewareService::Stub> write_stub_;
        // 读命令 rpc
        std::unique_ptr<middleware_rpc_proto::MiddlewareService::Stub> search_stub_;

        // 判断是否是查询命令
        bool is_search_;

        bq::log log;
    };
}// namespace raft::middleware